後面十天的 Streamlit 小專案會放在 GitHub 上,有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com。
今天我們要來製作對話紀錄的功能,廢話不多說,我們馬上開始吧!
首先第一個,我們要來製作呈現對話紀錄的功能,直到昨天為止,我們每問一個問題,就會把之前的對話洗掉,
今天我們要來使用 session 來存放我們的對話紀錄,並且在切換資料集的時候會把對話紀錄清空。
初始化 session_state 參數:
history 用於存放對話紀錄,而 selected_dataset 則用來暫存使用者選擇的資料集,預設為 “排便問題”。
import streamlit as st
datasets = {...}
# 初始化對話紀錄及選定資料集
if 'history' not in st.session_state:
st.session_state['history'] = []
if 'selected_dataset' not in st.session_state:
st.session_state['selected_dataset'] = "排便問題"
with st.sidebar:
...
with st.sidebar:
...
# 當資料集切換時,刪除對話紀錄
if dataset_option != st.session_state['selected_dataset']:
st.session_state['selected_dataset'] = dataset_option
st.session_state['history'] = []
st.title("問答機器人")
...
對話後新增對話紀錄並且顯示:
可以看到我們在塞入 ai 回覆的時候,除了將 role 及 content 塞入之外,還多塞了一個 references 欄位,這部分是為了明天要輸出對話紀錄的時候所做的預先動作,方便我們在看對話紀錄的時候能回朔到原始資料。
if question and openai_key:
...
st.session_state['history'].append({
"role": "user",
"content": question
})
st.session_state['history'].append({
"role": "ai",
"content": answer,
"references": [doc.metadata.get("refactor_answer") for doc in documents]
})
for message in st.session_state['history']:
with st.chat_message(message['role']):
st.write(message['content'])
elif question and not openai_key:
...
結果呈現:
完成到這邊後就可以讓對話紀錄接續呈現了,下方附上效果圖。
今天我們把對話紀錄呈現的功能實作上去了,明天我們要來做最後一步,輸出對話紀錄。